package com.xiao.dynamic_rule.service;

import com.xiao.dynamic_rule.pojo.BufferAvailableLevel;
import com.xiao.dynamic_rule.pojo.BufferResult;
import com.xiao.dynamic_rule.pojo.RuleParamAtomic;
import redis.clients.jedis.Jedis;

/**
 * @description: redis缓存管理方法
 * 将传入的条件去判断在redis中的命中情况：
 * 部分命中：将缓存中的数据返回，并且更新 查询路由 中查询条件的开始和结束时间
 * 全部命中：直接返回结果即可
 * 没有命中：无返回，使用 查询路由 去对应 flink state或者clickhouse中查
 * @author: 啸
 * @date: 2022/9/8 11:25
 */
public class BufferManager {
    private Jedis jedis;

    public BufferManager() {
        jedis = new Jedis("", 6379);
    }

    /**
     *
     * @param key
     * @param ruleParamAtomic
     * @return
     */
    public BufferResult getBufferData(String key, RuleParamAtomic ruleParamAtomic){
        BufferResult bufferResult = getBufferData(key, ruleParamAtomic.getRangeStart(), ruleParamAtomic.getRangeEnd(), ruleParamAtomic.getCnts());
        return bufferResult;
    }

    // 获取数据
    public BufferResult getBufferData(String key, Long paramRangeStart, Long paramRangeEnd, int threshold) {

        BufferResult bufferResult = new BufferResult();

        String data = jedis.get(key);

        if (data == null || data.split("//|").length < 2) return bufferResult;

        // data : 3|t1,t2
        String[] split = data.split("//|");
        String[] bufferRange = split[1].split(",");

        bufferResult.setKey(key);
        bufferResult.setValue(Integer.parseInt(split[0]));
        bufferResult.setBufferRangeStart(Long.parseLong(bufferRange[0]));
        bufferResult.setBufferRangeEnd(Long.parseLong(bufferRange[1]));

        // 判断缓存有效性
        if (paramRangeStart <= bufferResult.getBufferRangeStart()
                && paramRangeEnd >= bufferResult.getBufferRangeEnd()
                && threshold <= bufferResult.getValue()) {
            bufferResult.setBufferAvailableLevel(BufferAvailableLevel.WHOLE_AVL);
        } else if (paramRangeStart.equals(bufferResult.getBufferRangeStart()) && paramRangeEnd >= bufferResult.getBufferRangeEnd()){
            /**
             * | paramRangeEnd.equals(bufferResult.getBufferRangeEnd()) && paramRangeStart <= bufferResult.getBufferRangeStart()
             * 本来想到缓存的结束时间和传入的规则的结束时间相同，然后缓存开始时间>规则开始时间，这样应该是可以把规则的结束时间修改为缓存的开始时间的，想了一下是不用的：
             *      1、缓存的有效期为4小时，所以说缓存覆盖的有一部分是可以在state中计算的，剩下的在clickhouse中查询，既然都要查询clickhouse，就没必要缓存这部分数据。
             *      2、好像就想到这么多
             */
            // a&&b a和b都为true才是true   a|b 只有ab两个都为false才是false，只要有一个true就是true
            bufferResult.setBufferAvailableLevel(BufferAvailableLevel.WHOLE_AVL);
        }

        return bufferResult;
    }
    // 插入数据
    public void putBufferData (String bufferKey,int value,long bufferRangeStart,long bufferRangeEnd){
        jedis.setex(bufferKey,4*60*60, value+"|"+bufferRangeStart+","+bufferRangeEnd);

    }
    // 删除数据
    // 插入数据

}
